<?php

namespace chick1993\util;

class Arr
{
    /**
     * 对数组进行分组聚合
     * @param array $array
     * @param string|array $keys
     * @param string|array $fields 需要保留的字段，为空保留全部，字符串只保留当前字段的一维数组，数组则保留字段作为键的二维数组
     * @return array $result
     */
    function group(array $array, $keys, $fields = null): array
    {
        // 如果 $keys 是字符串，转换为数组
        if (!is_array($keys)) {
            $keys = [$keys];
        }

        $groupBy = function (array $array, array $keys) use (&$groupBy, $fields): array {
            // 取出当前分组的键
            $key = array_shift($keys);

            $result = [];
            foreach ($array as $item) {
                // 确保当前项有该键
                if (isset($item[$key])) {
                    $temp = [];
                    if (!empty($fields) && is_string($fields)) {
                        $temp = $item[$fields];
                    } else if (!empty($fields) && is_array($fields)) {
                        foreach ($fields as $field) {
                            $temp[$field] = $item[$field];
                        }
                    } else {
                        $temp = $item;
                    }
                    $result[$item[$key]][] = $temp;
                }
            }

            // 如果还有更多的键，继续递归分组
            if ($keys) {
                foreach ($result as $k => $value) {
                    $result[$k] = $groupBy($value, $keys);
                }
            }

            return $result;
        };

        // 使用递归函数进行分组
        return $groupBy($array, $keys);
    }
}